package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/go-redis/redis"
	"io"
	"os"
	"time"
)

var client *redis.Client

func InitRedis() {
	client = redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "", // no password set
		DB:       0,  // use default DB
	})
}

func main() {

	InitRedis()

	total := 0

	r := gin.Default()
	r.POST("upload", func(c *gin.Context) {
		// 获取上传文件
		file, fileHeader, err := c.Request.FormFile("upload")
		if err != nil {
			panic(err)
		}

		// 创建文件
		saveFile, err := os.OpenFile(fileHeader.Filename, os.O_RDWR, os.ModePerm)
		if err != nil {
			saveFile, err = os.Create(fileHeader.Filename)
			if err != nil {
				fmt.Println("文件创建失败")
			}
		}

		if res, err := client.Get(fileHeader.Filename).Int64(); err == nil {
			total = int(res)
			fmt.Println("这个文件已经上传过：", total)
			if total == int(fileHeader.Size) {
				fmt.Println("文件已存在")
				c.JSON(200, "文件已存在")
				return
			}
			file.Seek(int64(total), io.SeekStart)
		}

		fmt.Println("文件名称：", saveFile.Name())

		// 创建缓存区
		buff := make([]byte, 2048*4)

		for {
			nr, err := file.Read(buff)
			if err == io.EOF {
				break
			}
			total += nr
			// 写入内容到文件
			saveFile.WriteAt(buff, int64(total))
			err = client.Set(fileHeader.Filename, total, time.Duration(0)).Err()
			if err != nil {
				fmt.Println("total保存失败")
			}
		}
		fmt.Println("上传完成，total=", total)

		// 关闭文件
		saveFile.Close()
		c.JSON(200, "文件上传成功")
	})
	r.Run()
}
